home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / DSHJ2 / CMD.C < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-10  |  2.5 KB  |  122 lines

  1. #include    "comp.h"
  2.  
  3. #define     LIM        12        /* make sure EVEN !    */
  4.  
  5. extern unsigned char    *utinpt;
  6. extern unsigned        disp;
  7. extern char        advld, rldld;
  8. extern struct    slvll    *getslvbuf(), *Bslv;
  9.  
  10. funct_comm(fct,d,cpl)
  11. unsigned    fct, d;
  12. unsigned char    *cpl;
  13. {
  14.     unsigned char    sc[LIM];
  15.     unsigned    size, i;
  16.     unsigned char    c;
  17.  
  18. /*    memset(sc,0,LIM);            ** clear command buffer */
  19.     sc[0] = fct | 0x80;            /* mark 1st cmd code    */
  20.     switch (fct) {
  21.     case  9:                /* Vert. Move Forward    */
  22.         if (setp.omod == 0)        /* 8600 no odd value...    */
  23.             accval(&advld,&d);
  24.         goto next;
  25.     case 10:                /* Vert. Move Reverse    */
  26.         if (setp.omod == 0)        /* 8600 no odd value...    */
  27.             accval(&rldld,&d);
  28.         goto next;
  29.     case 11:                /* Horizontal Position    */
  30.     case 27: case 28:            /* Hor. Move Right/Left    */
  31.         size = 3;            /* size is 3 bytes    */
  32.         start(sc,setp.omod == 2 ?    /* 8200 no odd value...    */
  33.             d & 0xfffe : d,128);
  34.         break;
  35.     case  0: case  1: case  3:        /* CG original cmmds...    */
  36.     case  5: case  7: case  8:
  37.     case 15: case 16: case 17:
  38.     case 21:
  39.  
  40.     case 29: case 30: case 31:        /* GOG own cmmds...    */
  41.     case 32: case 33: case 44:
  42.     next:                    /* size is 3 bytes    */
  43.         size = 3;
  44.                         /* or different size    */
  45.     case 22:                /* if Typeface cmmd    */
  46.         start(sc,d,128);        /* set next 2 cmd codes */
  47.         break;
  48.     default:                /* others ? unknown...    */
  49.         size = 0;
  50.         break;
  51.     }
  52.     if (fct == 11)                /* Horizontal position    */
  53.         disp = d;
  54.     else
  55.     if (fct == 22) {            /* Typeface command    */
  56.         size = 9;
  57.         for (i = 3;i != 9;++i) {
  58.             c = (*cpl++ << 4);
  59.             c |= (*cpl++ & 0x0f);
  60.             sc[i] = c;
  61.         }
  62.     }
  63.     else
  64.     if (fct == 27)                /* Horizontal move Right*/
  65.         disp += d;
  66.     else
  67.     if (fct == 28) {            /* Horizontal move Left */
  68.       if (disp >= d)
  69.         disp -= d;
  70.     }
  71.     if (size) movcmds(sc,size);
  72.  
  73. long_char_for(c,d)
  74. unsigned char    c;
  75. unsigned    d;
  76. {
  77.     unsigned char    sc[4];
  78.     
  79.     sc[0] = c | 0x80;
  80. /*    sc[1] = sc[2] = 0;    */
  81.     start(sc,(setp.omod == 2) ? disp & 0xfffe:disp,0);
  82.     disp += d;
  83.     movcmds(sc,3);
  84. }
  85.  
  86. movcmds(sc,lim)
  87. unsigned char    *sc;
  88. unsigned    lim;
  89. {
  90.     struct    slvll    *nslv;
  91.  
  92.     if ((utinpt + lim) < (Bslv->bufptr + UTSIZE)) {
  93. doit:        f_move(sc,utinpt,lim);
  94.         utinpt += lim;
  95.     }
  96.     else {
  97.         *utinpt++ = 0x80 | SLVEOB;
  98.         *utinpt   = 0x80;
  99.         if (!(nslv = getslvbuf()))    /* get new list member    */
  100.             cpabt = 7;
  101.         else {
  102.             Bslv->fptr = nslv;    /* add member to list    */
  103.             Bslv    = nslv;
  104.             utinpt    = Bslv->bufptr;    /* reset buf pointer    */
  105.             goto doit;
  106.         }
  107.     }
  108. }
  109.  
  110. accval(fg,d)
  111. char     *fg;
  112. unsigned *d;
  113. {
  114.     if (*fg) *d = *d + 1;
  115.     if (*d % 2) {
  116.         *fg = 1;
  117.         *d &= 0xfffe;
  118.     }
  119.     else    *fg = 0;
  120. }
  121.